/*
 * @Author: sunboy
 * @LastEditors: sunboy
 * @Date: 2025-07-28 12:12:57
 * @LastEditTime: 2025-07-28 14:39:21
 */
#ifndef INTERCEPTOR_H
#define INTERCEPTOR_H

#include <stdint.h>
#include <wchar.h>

#ifdef __cplusplus
extern "C" {
#endif

// 动态库导出宏定义
#ifdef _WIN32
    #ifdef INTERCEPTOR_EXPORTS
        #define INTERCEPTOR_API __declspec(dllexport)
    #else
        #define INTERCEPTOR_API __declspec(dllimport)
    #endif
#else
    #define INTERCEPTOR_API __attribute__((visibility("default")))
#endif

// 键盘事件数据结构体
typedef struct {
    int event_type;     // 事件类型 (EVENT_KEY_PRESSED, EVENT_KEY_RELEASED, EVENT_KEY_TYPED)
    uint16_t keycode;   // 键码
    uint16_t rawcode;   // 原始码
    wchar_t keychar;    // 字符
} keyboard_event_data_t;

// 键盘事件回调函数类型定义（栈分配版本 - 用于同步C回调）
// 参数：
// - event_data: 包含键盘事件所有信息的结构体指针（在回调期间有效）
typedef void (*keyboard_callback_t)(const keyboard_event_data_t* event_data);

// 键盘事件回调函数类型定义（堆分配版本 - 用于跨语言异步调用）
// 参数：
// - event_data: 包含键盘事件所有信息的结构体指针（需要手动释放）
typedef void (*keyboard_callback_heap_t)(keyboard_event_data_t* event_data);

// 注册键盘事件回调函数（栈分配模式，适用于同步C回调）
INTERCEPTOR_API void set_keyboard_callback(keyboard_callback_t callback);

// 注册键盘事件回调函数（堆分配模式，适用于跨语言异步调用）
INTERCEPTOR_API void set_keyboard_callback_heap(keyboard_callback_heap_t callback);

// 释放堆分配的键盘事件数据（仅在使用堆分配模式时需要调用）
INTERCEPTOR_API void free_keyboard_event_data(keyboard_event_data_t* event_data);

// 设置hook分发处理器的包装函数
INTERCEPTOR_API void wrapper_hook_dispatch_proc(void);

#ifdef __cplusplus
}
#endif

#endif // INTERCEPTOR_H
